package net.lucamasini.fantacalcio.gwt.client.presenter;

import java.util.ArrayList;
import java.util.List;

import net.lucamasini.fantacalcio.gwt.client.event.*;
import net.lucamasini.fantacalcio.gwt.client.view.GiornataView;
import net.lucamasini.fantacalcio.server.model.Giornata;
import net.lucamasini.fantacalcio.server.model.Partita;
import net.lucamasini.fantacalcio.server.service.GiornataServiceAsync;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.HasWidgets;

import static net.lucamasini.fantacalcio.gwt.client.Fantacalcio.getEventBus;

public class GiornataPresenter implements Presenter {

	private final GiornataView view;
	private final GiornataServiceAsync giornataService;
	private Giornata currentGiornata;
	
	public GiornataPresenter(GiornataView view, GiornataServiceAsync giornataService) {
		
		this.view = view;
		this.giornataService = giornataService;
		
		bindEvents();
	}

	public void fetchCurrentGiornata() {
		
		giornataService.currentGiornata(new AsyncCallback<Giornata>() {
			
			@Override
			public void onSuccess(Giornata giornata) {
				
				currentGiornata = giornata;
			}
			
			@Override
			public void onFailure(Throwable caught) {
				GWT.log("populate()", caught);
			}
		});
	}
	
	@Override
	public void go(HasWidgets container) {
        fetchCurrentGiornata();

        container.clear();
		container.add(view.asWidget());
		
		populatePanel();
	}
	
    private void populatePanel() {
    	if( currentGiornata==null) {
    		return;
    	}
    	
		List<Partita> listValues = new ArrayList<Partita>();
        for(Partita partita: currentGiornata.getPartite()){
        	listValues.add(partita);
        }
		listValues.add(new Partita.PartitaBuilder(currentGiornata).withCasa("&nbsp;").withTrasferta("&nbsp;").build());
        view.partite().setRowData(0, listValues);
	}

	private void bindEvents() {

        getEventBus().addHandler(SalvaGiornataEvent.TYPE, new SalvaGiornataEventHandler() {
			
			@Override
			public void onSalvaGiornata(SalvaGiornataEvent event) {
				
				salvaGiornata();
			}

		});
    }

	private void salvaGiornata() {
		if(currentGiornata==null) {
			
			Giornata newGiornata = new Giornata.GiornataBuilder().
						withDescrizione(view.descrizione().getValue()).
						withDataInizioPronostici(view.dataInizioPronostici().getValue()).
						withDataFinePronostici(view.dataFinePronostici().getValue()).
						build();
			
			giornataService.creaGiornata(newGiornata, new AsyncCallback<Giornata>() {

				@Override
				public void onFailure(Throwable caught) {
				}

				@Override
				public void onSuccess(Giornata savedGiornata) {
					
					currentGiornata = savedGiornata;
				}
			});
		} else {
			
		}
	}
	
}
